<?php
namespace app\lawcase\controller;

use app\base\BaseController;
use app\lawcase\model\NodeType as NodeTypeModel;
use app\lawcase\validate\NodeTypeCheck;
use think\facade\View;

class NodeType extends BaseController
{
    protected $model;

    public function __construct()
    {
        parent::__construct();
        $this->model = new NodeTypeModel();
    }

    /**
     * 节点类型列表
     */
    public function index()
    {
        if (request()->isAjax()) {
            try {
                $param = get_params();
                $where = [];
                if (!empty($param['keywords'])) {
                    $where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
                }

                $result = $this->model->getList($where, $param);
                
                // 检查返回结果是否为数组
                if (!is_array($result)) {
                    throw new \Exception('返回数据格式不正确');
                }

                // 如果返回的是空数据
                if (empty($result['data'])) {
                    return table_assign(0, '暂无数据', [], [], 0);
                }

                // 确保返回的数据包含必要的字段
                if (!isset($result['code']) || !isset($result['data']) || !isset($result['count'])) {
                    throw new \Exception('返回数据缺少必要字段');
                }

                // 处理时间戳
                $data = array_map(function($item) {
                    if (isset($item['create_time'])) {
                        $item['create_time'] = $item['create_time'] ? date('Y-m-d H:i:s', intval($item['create_time'])) : '';
                    }
                    if (isset($item['update_time'])) {
                        $item['update_time'] = $item['update_time'] ? date('Y-m-d H:i:s', intval($item['update_time'])) : '';
                    }
                    return $item;
                }, $result['data']);

                // 返回处理后的数据
                return json([
                    'code' => 0,
                    'msg' => $result['msg'],
                    'count' => $result['count'],
                    'data' => $data
                ]);
            } catch (\Exception $e) {
                return json([
                    'code' => 1,
                    'msg' => $e->getMessage(),
                    'count' => 0,
                    'data' => []
                ]);
            }
        }
        return view();
    }


    /**
     * 添加节点类型
     */
    public function add()
    {
        if (request()->isAjax()) {
            $param = get_params();
            
            try {
                validate(NodeTypeCheck::class)->scene('add')->check($param);
            } catch (\think\exception\ValidateException $e) {
                return to_assign(1, $e->getError());
            }
            
            // 检查节点类型名称是否已存在
            if ($this->model->nameExists($param['name'], $param['case_type'])) {
                return to_assign(1, '该案件类型下已存在相同名称的节点');
            }
            
            // 使用 description 字段存储案件类型
            $param['description'] = $param['case_type'];
            
            $result = $this->model->add($param);
            return to_assign($result['code'], $result['msg'], $result['data'] ?? []);
        }
        
        $caseTypes = NodeTypeModel::getCaseTypes();
        View::assign('caseTypes', $caseTypes);
        View::assign('detail', ['sort' => 100]);
        return view();
    }

    /**
     * 编辑节点类型
     */
    public function edit()
    {
        if (request()->isAjax()) {
            $param = get_params();

            try {
                validate(NodeTypeCheck::class)->scene('edit')->check($param);
            } catch (\think\exception\ValidateException $e) {
                return to_assign(1, $e->getError());
            }

            // 检查节点类型名称是否已存在（排除当前编辑的记录）
            if ($this->model->nameExists($param['name'], $param['case_type'], $param['id'])) {
                return to_assign(1, '该案件类型下已存在相同名称的节点');
            }

            // 使用 description 字段存储案件类型
            $param['description'] = $param['case_type'];

            $result = $this->model->edit($param);
            return to_assign($result ? 0 : 1, $result ? '修改成功' : '修改失败');
        }

        $id = input('id', 0);
        $detail = $this->model->getDetail($id);
        if (!$detail) {
            return to_assign(1, '节点类型不存在');
        }
        $caseTypes = NodeTypeModel::getCaseTypes();
        View::assign('caseTypes', $caseTypes);
        View::assign('detail', $detail);
        return view('add');
    }

    /**
     * 删除节点类型
     */
    public function delete()
    {
        if (request()->isAjax()) {
            $ids = get_params('ids');
            $ids = is_array($ids) ? $ids : [$ids];
            try {
                $result = $this->model->remove($ids);
                return to_assign($result ? 0 : 1, $result ? '删除成功' : '删除失败');
            } catch (\Exception $e) {
                return to_assign(1, $e->getMessage());
            }
        }
    }

    /**
     * 更新排序
     */
    public function sort()
    {
        if (request()->isAjax()) {
            $param = get_params();
            try {
                $result = $this->model->updateSort($param['id'], $param['sort']);
                return to_assign($result ? 0 : 1, $result ? '排序更新成功' : '排序更新失败');
            } catch (\Exception $e) {
                return to_assign(1, $e->getMessage());
            }
        }
    }
}